package interpreter_pattern.ex1;

/**
 * 表达式的抽象类
 * @author 申书航
 * @version 1.0
 */
public abstract class Expression {

    protected abstract String one(); // 返回表示1的字符串

    protected abstract String four(); // 返回表示4的字符串

    protected abstract String five(); // 返回表示5的字符串

    protected abstract String nine(); // 返回表示9的字符串

    protected abstract int multiple(); // 返回对应的倍数

    /**
     * 解释上下文中的输入，并更新输出
     *
     * @param ctx 上下文，包含输入和输出
     */
    public void interpret(Context ctx) {
        //如果输入字符串为空不做处理
        if (ctx.getInput().isEmpty()) {
            return;
        }
        //处理特殊字符位
        if (ctx.getInput().startsWith(four())) {
            ctx.setOutput(ctx.getOutput() + 4 * multiple());
            ctx.setInput(ctx.getInput().substring(2));
        } else if (ctx.getInput().startsWith(five())) {
            ctx.setOutput(ctx.getOutput() + 5 * multiple());
            ctx.setInput(ctx.getInput().substring(1));
        } else if (ctx.getInput().startsWith(nine())) {
            ctx.setOutput(ctx.getOutput() + 9 * multiple());
            ctx.setInput(ctx.getInput().substring(2));
        }
        //处理单位字符位
        while (ctx.getInput().startsWith(one())){
            ctx.setOutput(ctx.getOutput() + multiple());
            ctx.setInput(ctx.getInput().substring(1));
        }
    }
}
